package com.shengxi.mqtt;

import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;

/**
 * @author WXY
 * @date 2022/6/29 20:43
 */
@Slf4j
public class MyMqttCallback implements MqttCallbackExtended {

    private MyMqttClient myMqttClient;

    public MyMqttCallback(MyMqttClient myMqttClient) {
        this.myMqttClient = myMqttClient;
    }


    /**
     * 丢失连接，可在这里做重连
     * 只会调用一次
     *
     * @param throwable
     */
    @Override
    public void connectionLost(Throwable throwable) {
        log.error("mqtt connectionLost 连接断开，尝试重连: {}", throwable.getMessage());
        /*long reconnectTimes = 1;
        //注意，这个try必须放到外面，否则会一直断开重连
        try {
            while (true) {
                if (MyMqttClient.getClient().isConnected()) {
                    //判断已经重新连接成功  需要重新订阅主题 可以在这个if里面订阅主题  或者 connectComplete（方法里面）  看你们自己选择
                    log.warn("mqtt reconnect success end  重新连接  重新订阅成功");
                    return;
                } else {
                    reconnectTimes += 1;
                    log.warn("mqtt reconnect times = {} try again...  mqtt重新连接时间 {}", reconnectTimes, reconnectTimes);
                    MyMqttClient.getClient().reconnect();
                }
                //重连后休眠1s
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                }
            }
        } catch (MqttException e) {
            log.error("mqtt断连异常", e);
        }*/
    }

    /**
     * @param topic
     * @param mqttMessage
     * @throws Exception subscribe后得到的消息会执行到这里面
     */
    @Override
    public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
        log.info("接收消息主题 : {}，接收消息内容 : {}", topic, new String(mqttMessage.getPayload()));
        //发布消息主题
        if (topic.equals("xyf")) {
            String msgStr = new String(mqttMessage.getPayload());
            //你自己的业务接口
            if ("1".equals(msgStr)) {
                //自己手动造异常
                int i = 1 / 0;
            }
        }
        //接收报警主题
        if (topic.equals("hly")) {
            String msgStr = new String(mqttMessage.getPayload());
            //你自己的业务接口
        }
    }


    /**
     * 连接成功后的回调 可以在这个方法执行 订阅主题  生成Bean的 MqttConfiguration方法中订阅主题 出现bug
     * 重新连接后  主题也需要再次订阅  将重新订阅主题放在连接成功后的回调 比较合理
     *
     * @param reconnect
     * @param serverURI
     */
    @Override
    public void connectComplete(boolean reconnect, String serverURI) {
        log.info("MQTT 连接成功，连接方式：{}", reconnect ? "重连" : "直连");
        //订阅主题
        myMqttClient.subscribe("xyf");
    }

    /**
     * publish后，配送完成后回调的方法
     *
     * @param iMqttDeliveryToken
     */
    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        log.info("==========deliveryComplete={}==========", iMqttDeliveryToken.isComplete());
    }
}

